package cn.wen.javax.xml;

import java.io.ByteArrayOutputStream;
import java.io.FileWriter;

import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import cn.wen.java.io.HelperOfIO;
import cn.wen.java.nio.Charset;

/**
 * <p>
 * Title: Dom4J 的 辅助类
 * <p>
 * Description: Xml相关操作。
 * <p>
 * Copyright: Copyright (c) 2010-2012
 * 
 * @author <a href="mailto:ct_wen@qq.com">ctwen</a>, 温承瑭
 * @version Revision: 1.0 Date: 2010/12/7 description：初完成。
 *          </P>
 */
public class HelperOfDom4J {

    private static final Logger log = Logger.getLogger(HelperOfDom4J.class);

    /**
     * 读取XML文件并返回XML解释对象Document
     * <p>
     * 查找结点的推荐方法：<br>
     * selectSingleNode("//department/level"); <br>
     * selectNodes("//department/employeeList/employee");
     * <p>
     * 注：文档的根路径亦是ClassPath。<br>
     * 
     * @param file XML文件存在的路径
     * @return Document
     */
    public static Document readyXMLFromSystemId(String file) {
	SAXReader reader = new SAXReader();
	Document document = null;
	try {
	    document = reader.read(file);
	}
	catch (DocumentException e) {
	    log.error("读取XML文件的是时候出错，系统找不到指定的文件，原因可能是：1.路经不正确2.文件不存在。其他：" + e.getMessage(), e);
	}
	return document;
    }

    /**
     * 读取XML文件并返回XML解释对象Document
     * <p>
     * 查找结点的推荐方法：<br>
     * selectSingleNode("//department/level"); <br>
     * selectNodes("//department/employeeList/employee");
     * <p>
     * 注：文档的路径是URL地址。<br>
     * 
     * @param file XML文件存在的路径
     * @return Document
     */
    public static Document readyXMLFromUrl(java.net.URL url) {
	SAXReader reader = new SAXReader();
	Document document = null;
	try {
	    document = reader.read(url);
	}
	catch (DocumentException e) {
	    log.error("读取XML文件的是时候出错，系统找不到指定的文件。" + e.getMessage(), e);
	}
	return document;
    }

    /**
     * 将文档解释成文本
     * 
     * @param document 文档对象
     * @return
     */
    public static String documentToString(Document document) {
	String s = "";
	// 使用输出流来进行转化
	ByteArrayOutputStream os = new ByteArrayOutputStream();
	try {
	    // 使用UTF-8编码
	    OutputFormat formatter = new OutputFormat("", false, Charset.UTF_8);
	    XMLWriter writer = new XMLWriter(os, formatter);
	    writer.write(document);
	    s = os.toString();
	    writer.close();
	}
	catch (Exception e) {
	    log.error(e.getMessage(), e);
	}
	finally {
	    HelperOfIO.closes(os);
	}
	return s;
    }

    /**
     * 将文本解释成文档对象
     * 
     * @param content 内容
     * @return 文档对象
     */
    public static Document stringToDocument(String content) {
	Document doc = null;
	try {
	    doc = DocumentHelper.parseText(content);
	}
	catch (Exception e) {
	    log.error(e.getMessage(), e);
	}
	return doc;
    }

    /**
     * 将文档写到文件系统中，以XML方式。
     * 
     * @param document 文档对象
     * @param filename 路径及文件名
     */
    public static void toXmlFile(Document document, String filename) {
	try {
	    // 默认为UTF-8格式
	    OutputFormat formatter = OutputFormat.createPrettyPrint();
	    XMLWriter writer = new XMLWriter(new FileWriter(filename), formatter);
	    writer.write(document);
	    writer.flush();
	    writer.close();
	}
	catch (Exception e) {
	    log.error(e.getMessage(), e);
	}
    }

}
